package com.mazaiting.redeye.bean

import com.google.gson.annotations.SerializedName

/***
 *
 *
 *                                                    __----~~~~~~~~~~~------___
 *                                   .  .   ~~//====......          __--~ ~~
 *                   -.            \_|//     |||\\  ~~~~~~::::... /~
 *                ___-==_       _-~o~  \/    |||  \\            _/~~-
 *        __---~~~.==~||\=_    -_--~/_-~|-   |\\   \\        _/~
 *    _-~~     .=~    |  \\-_    '-~7  /-   /  ||    \      /
 *  .~       .~       |   \\ -_    /  /-   /   ||      \   /
 * /  ____  /         |     \\ ~-_/  /|- _/   .||       \ /
 * |~~    ~~|--~~~~--_ \     ~==-/   | \~--===~~        .\
 *          '         ~-|      /|    |-~\~~       __--~~
 *                      |-~~-_/ |    |   ~\_   _-~            /\
 *                           /  \     \__   \/~                \__
 *                       _--~ _/ | .-~~____--~-/                  ~~==.
 *                      ((->/~   '.|||' -_|    ~~-/ ,              . _||
 *                                 -_     ~\      ~~---l__i__i__i--~~_/
 *                                 _-~-__   ~)  \--______________--~~
 *                               //.-~~~-~_--~- |-------~~~~~~~~
 *                                      //.-~~~--\
 *                               神兽保佑
 *                              代码无BUG!
 * @author mazaiting
 * @date 2019-07-11
 * @description 人脸识别 Bean
 */

/**
 * 令牌实体
 */
data class ResponseFaceTokenBean(
    /**
     * 刷新令牌
     */
    @SerializedName("refresh_token")
    val refreshToken: String,
    /**
     * 过期时间
     */
    @SerializedName("expires_in")
    val expiresIn: String,
    /**
     * Session 键
     */
    @SerializedName("session_key")
    val sessionKey: String,
    /**
     * 接受令牌
     */
    @SerializedName("access_token")
    val accessToken: String,
    /**
     * 访问域
     */
    @SerializedName("scope")
    val scope: String,
    /**
     * Session 密钥
     */
    @SerializedName("session_secret")
    val sessionSecret: String
)

/**
 * 人脸图片 Bean
 */
data class RequestFaceImageBean(
    /**
     * 图片信息
     */
    @SerializedName("image")
    val image: String,
    /**
     * 默认只返回face_token、人脸框、概率和旋转角度
     * 包括age,beauty,expression,face_shape,gender,glasses,landmark,landmark150,race,quality,eye_status,emotion,face_type信息
     */
    @SerializedName("face_field")
    val faceField: String,
    /**
     * 图片类型
     * BASE64 / URL / FACE_TOKEN
     */
    @SerializedName("image_type")
    val imageType: String
)

/**
 * 检测图片结果
 */
data class ResponseDetectImageResultBean(
    /**
     * 错误码
     */
    @SerializedName("error_code")
    val errorCode: String,
    /**
     * 错误信息
     */
    @SerializedName("error_msg")
    val errorMsg: String,
    /**
     * 登录 ID
     */
    @SerializedName("log_id")
    val logId: String,
    /**
     * 时间戳
     */
    @SerializedName("timestamp")
    val timestamp: String,
    /**
     * 缓存
     */
    @SerializedName("cached")
    val cached: String,
    /**
     * 结果
     */
    @SerializedName("result")
    val result: ResponseFaceImageResultBean?
)

/**
 * 人脸图片结果
 */
data class ResponseFaceImageResultBean(
    /**
     * 脸部数量
     */
    @SerializedName("face_num")
    val faceNum: Int,
    /**
     * 脸部列表
     */
    @SerializedName("face_list")
    val faceList: List<ResponseFaceImageBean>
)

/**
 * 脸部图片数据响应数据
 */
data class ResponseFaceImageBean(
    /**
     * 人脸图片的唯一标识
     */
    @SerializedName("face_token")
    val faceToken: String,
    /**
     * 人脸位置
     */
    @SerializedName("location")
    val location: ResponseFaceLocationBean,
    /**
     * 	人脸置信度，范围【0~1】，代表这是一张人脸的概率，0最小、1最大
     */
    @SerializedName("face_probability")
    val faceProbability: Double,
    /**
     * 人脸旋转角度参数
     */
    @SerializedName("angel")
    val angel: ResponseFaceAngelBean,
    /**
     * 年龄 ，当face_field包含age时返回
     */
    @SerializedName("age")
    val age: Double,
    /**
     * 美丑打分，范围0-100，越大表示越美。当face_fields包含beauty时返回
     */
    @SerializedName("beauty")
    val beauty: Double,
    /**
     * 表情，当 face_field包含expression时返回
     * type: none:不笑；smile:微笑；laugh:大笑
     * probability: 表情置信度，范围【0~1】，0最小、1最大
     */
    @SerializedName("expression")
    val expression: ResponseFaceCommonBean,
    /**
     * 脸型，当face_field包含face_shape时返回
     * type: square: 正方形 triangle:三角形 oval: 椭圆 heart: 心形 round: 圆形
     * probability: 置信度，范围【0~1】，代表这是人脸形状判断正确的概率，0最小、1最大
     */
    @SerializedName("face_shape")
    val faceShape: ResponseFaceCommonBean,
    /**
     * 性别，face_field包含gender时返回
     * type: ic_male:男性 ic_female:女性
     * probability: 性别置信度，范围【0~1】，0代表概率最小、1代表最大
     */
    @SerializedName("gender")
    val gender: ResponseFaceCommonBean,
    /**
     * 是否带眼镜，face_field包含glasses时返回
     * type: none:无眼镜，common:普通眼镜，sun:墨镜
     * probability: 眼镜置信度，范围【0~1】，0代表概率最小、1代表最大
     */
    @SerializedName("glasses")
    val glasses: ResponseFaceCommonBean,
    /**
     * 双眼状态（睁开/闭合） face_field包含eye_status时返回
     */
    @SerializedName("eye_status")
    val eyeStatus: ResponseFaceEyeStatusBean,
    /**
     * 情绪 face_field包含emotion时返回
     * type: angry:愤怒 disgust:厌恶 fear:恐惧 happy:高兴 sad:伤心 surprise:惊讶 neutral:无情绪
     * probability: 情绪置信度，范围0~1
     */
    @SerializedName("emotion")
    val emotion: ResponseFaceCommonBean,
    /**
     * 人种 face_field包含race时返回
     * type: yellow: 黄种人 white: 白种人 black:黑种人 arabs: 阿拉伯人
     * probability: 人种置信度，范围【0~1】，0代表概率最小、1代表最大
     */
    @SerializedName("race")
    val race: ResponseFaceCommonBean,
    /**
     * 真实人脸/卡通人脸 face_field包含face_type时返回
     * type: human: 真实人脸 cartoon: 卡通人脸
     * probability: 人脸类型判断正确的置信度，范围【0~1】，0代表概率最小、1代表最大
     */
    @SerializedName("face_type")
    val faceType: ResponseFaceCommonBean,
    /**
     * 4个关键点位置，左眼中心、右眼中心、鼻尖、嘴中心。face_field包含landmark时返回
     */
    @SerializedName("landmark")
    val landmark: Any,
    /**
     * 72个特征点位置 face_field包含landmark72时返回
     */
    @SerializedName("landmark72")
    val landmarkSevenTwo: Any,
    /**
     * 150个特征点位置 face_field包含landmark150时返回
     */
    @SerializedName("landmark150")
    val landmarkHundredFifty: Any,
    /**
     * 人脸质量信息。face_field包含quality时返回
     */
    @SerializedName("quality")
    val quality: ResponseFaceQualityBean
)

/**
 * 脸部位置响应
 */
data class ResponseFaceLocationBean(
    /**
     * 人脸区域离左边界的距离
     */
    @SerializedName("left")
    val left: Double,
    /**
     * 人脸区域离上边界的距离
     */
    @SerializedName("top")
    val top: Double,
    /**
     * 人脸宽度
     */
    @SerializedName("width")
    val width: Double,
    /**
     * 人脸高度
     */
    @SerializedName("height")
    val height: Double,
    /**
     * 人脸框相对于竖直方向的顺时针旋转角，[-180,180]
     */
    @SerializedName("rotation")
    val rotation: Int
)

/**
 * 人脸旋转角度参数
 */
data class ResponseFaceAngelBean(
    /**
     * 三维旋转之左右旋转角[-90(左), 90(右)]
     */
    @SerializedName("yaw")
    val yaw: Double,
    /**
     * 三维旋转之俯仰角度[-90(上), 90(下)]
     */
    @SerializedName("pitch")
    val pitch: Double,
    /**
     * 平面内旋转角[-180(逆时针), 180(顺时针)]
     */
    @SerializedName("roll")
    val roll: Double
)

/**
 * 人脸公共实体
 */
data class ResponseFaceCommonBean(
    /**
     * 类型
     */
    @SerializedName("type")
    val type: String,
    /**
     * 置信度
     */
    @SerializedName("probability")
    val probability: Double
)

/**
 * 人脸眼睛状态
 */
data class ResponseFaceEyeStatusBean(
    /**
     * 左眼状态 [0,1]取值，越接近0闭合的可能性越大
     */
    @SerializedName("left_eye")
    val leftEye: String,
    /**
     * 右眼状态 [0,1]取值，越接近0闭合的可能性越大
     */
    @SerializedName("right_eye")
    val rightEye: String
)

/**
 * 人脸关键点坐标
 */
data class ResponseFacePointBean(
    /**
     * x 坐标
     */
    @SerializedName("x")
    val x: Double,
    /**
     * y 坐标
     */
    @SerializedName("y")
    val y: Double
)

/**
 * 人脸质量信息。face_field包含quality时返回
 */
data class ResponseFaceQualityBean(
    /**
     * 人脸各部分遮挡的概率，范围[0~1]，0表示完整，1表示不完整
     */
    @SerializedName("occlusion")
    val occlusion: ResponseFaceOcclusionBean,
    /**
     * 人脸模糊程度，范围[0~1]，0表示清晰，1表示模糊
     */
    @SerializedName("blur")
    val blur: Double,
    /**
     * 取值范围在[0~255], 表示脸部区域的光照程度 越大表示光照越好
     */
    @SerializedName("illumination")
    val illumination: Double,
    /**
     * 人脸完整度，0或1, 0为人脸溢出图像边界，1为人脸都在图像边界内
     */
    @SerializedName("completeness")
    val completeness: Int
)

/**
 * 人脸各部分遮挡的概率
 * left_eye : 0.6, #左眼被遮挡的阈值
 * right_eye : 0.6, #右眼被遮挡的阈值
 * nose : 0.7, #鼻子被遮挡的阈值
 * mouth : 0.7, #嘴巴被遮挡的阈值
 * left_cheek : 0.8, #左脸颊被遮挡的阈值
 * right_cheek : 0.8, #右脸颊被遮挡的阈值
 * chin_contour : 0.6, #下巴被遮挡阈值
 */
data class ResponseFaceOcclusionBean(
    /**
     * 左眼遮挡比例，[0-1] ，1表示完全遮挡
     */
    @SerializedName("left_eye")
    val leftEye: Double,
    /**
     * 右眼遮挡比例，[0-1] ， 1表示完全遮挡
     */
    @SerializedName("right_eye")
    val rightEye: Double,
    /**
     * 鼻子遮挡比例，[0-1] ， 1表示完全遮挡
     */
    @SerializedName("nose")
    val nose: Double,
    /**
     * 嘴巴遮挡比例，[0-1] ， 1表示完全遮挡
     */
    @SerializedName("mouth")
    val mouth: Double,
    /**
     * 左脸颊遮挡比例，[0-1] ， 1表示完全遮挡
     */
    @SerializedName("left_cheek")
    val leftCheek: Double,
    /**
     * 右脸颊遮挡比例，[0-1] ， 1表示完全遮挡
     */
    @SerializedName("right_cheek")
    val rightCheek: Double,
    /**
     * 下巴遮挡比例，，[0-1] ， 1表示完全遮挡
     */
    @SerializedName("chin")
    val chin: Double
)